#ifndef RECTA2D_H
#define RECTA2D_H

#include "vector2d.h"

/**
 * Linea recta de longitud infinita definida por la ecuacion vectorial:
 *      punto = lambda * direccion + origen
 * Donde:
 *      punto: cualquier punto de la recta
 *      lambda: el parametro
 *      direccion: el vector de direccion
 *      origen: el punto de origen
 *
 */
class GEOMETRIA_EXPORT Recta2d
{
public:
    Recta2d();
    Recta2d(const Punto2d& origen, const Vector2d& direccion);
    Recta2d(const Punto2d& p1, const Punto2d& p2);
    Recta2d(const Punto2d& origen, const Angulo& angulo);

    QString toString() const;

    Vector2d getDireccion() const { return direccion; }

    void setDireccion(const Vector2d& direccion) { this->direccion = direccion; }

    Punto2d getOrigen() const { return origen; }

    void setOrigen(const Punto2d& origen) { this->origen = origen; }

    Angulo getAngulo() const;

    Angulo calcularMenorAngulo(Recta2d otraLinea) const;

    bool esParalela(const Recta2d& otraLinea) const;

    Punto2d interseccion(const Recta2d& otraLinea) const;
    
    Punto2d calcularInterseccion(const Recta2d& otraLinea) const;

    Punto2d calcularPuntoDistancia(double distancia) const;
    Recta2d perpendicular(const Punto2d& punto) const;    

    bool contiene(const Punto2d& punto) const;
    Punto2d proyeccionPerpendicular(const Punto2d& punto) const;

    Punto2d reflejar(const Punto2d& punto) const;
    Vector2d proyectar(const Vector2d& vector) const;

    bool esValida() { return direccion.esValido() && origen.esValido(); } 

private:
    Vector2d direccion;
    Punto2d origen;
};

#endif // RECTA_H
